{
  "openapi": "3.1.0",
  "info": {
    "title": "Відкритий API спільних ресурсів",
    "description": "Керуйте спільними ресурсами (проксі, групами та тегами) за допомогою відкритого API MoreLogin.\n\n**Базовий URL**: `https://api.morelogin.com`\n\nАвтентифікація здійснюється за допомогою токена OAuth2 Bearer. Детальніше див. у розділі [Автентифікація](../Getting%20Started/authentication.md).\n",
    "version": "2026-09-05"
  },
  "tags": [
    {
      "name": "Proxy Management",
      "description": "Створення, оновлення, видалення та перегляд налаштувань проксі"
    },
    {
      "name": "Group Management",
      "description": "Створення, оновлення, видалення та перегляд груп середовищ"
    },
    {
      "name": "Tag Management",
      "description": "Створення, оновлення, видалення та перегляд тегів середовищ"
    },
    {
      "name": "Webhook Management",
      "description": "Налаштування ендпоінта зворотного виклику команди, який приймає події вебхуків"
    }
  ],
  "paths": {
    "/proxyInfo/page": {
      "post": {
        "summary": "Отримання списку проксі-серверів",
        "deprecated": false,
        "description": "Посторінково виводить конфігурації проксі команди.\n- **Ефект**: відсутній. Лише читання. Повтор безпечний з обмеженою витримкою.\n- **Примітка**: паролі не повертаються звичайним учасникам, а також для хмарних і динамічних проксі. Динамічні проксі відображаються тут, але керуються в іншому місці й не редагуються через ендпоінти проксі.",
        "operationId": "queryProxyInfoPageUsingPOST",
        "tags": [
          "Proxy Management"
        ],
        "parameters": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "id": {
                    "type": "string",
                    "pattern": "^\\d+$",
                    "description": "Необов’язковий ID проксі для точного збігу. Передавайте 64-бітний ID десятковим рядком, щоб уникнути втрати точності. Не вказуйте його, щоб не фільтрувати за ID. Інші фільтри та пагінація залишаються чинними.",
                    "example": "1800000000000101"
                  },
                  "pageNo": {
                    "type": "integer",
                    "description": "Номер поточної сторінки (починаючи з 1)",
                    "example": 1
                  },
                  "pageSize": {
                    "type": "integer",
                    "description": "Кількість елементів на сторінці",
                    "example": 10
                  },
                  "isCloudPhoneProxy": {
                    "type": "boolean",
                    "description": "Чи використовується проксі для хмарних телефонів.\n- `true`: Виключити локальні та приватні IP (наприклад, 127.0.0.1, 360, pia, приватні діапазони)\n- `false`: Повернути всі проксі\n",
                    "example": false
                  },
                  "proxyCategoryType": {
                    "type": "integer",
                    "description": "Категорія проксі:\n- `1` = Хмарна платформа\n- `2` = Власний IP\n",
                    "example": 2
                  },
                  "proxyIp": {
                    "type": "string",
                    "description": "Фільтр за IP-адресою проксі (часткова відповідність)",
                    "example": ""
                  },
                  "proxyName": {
                    "type": "string",
                    "description": "Фільтр за назвою проксі (часткова відповідність)",
                    "example": ""
                  },
                  "proxyProviders": {
                    "type": "array",
                    "items": {
                      "type": "integer"
                    },
                    "description": "Список ID сервісів проксі. Допустимі значення:\n- `0` = Немає\n- `4` = Oxylabs\n- `5` = Proxys.io\n- `6` = GeoSurf\n- `7` = Luminati\n- `8` = Lumauto\n- `9` = Oxylabsauto\n- `10` = Trojan\n- `11` = Shadowsocks\n- `12` = vmess\n- `13` = ABCPROXY\n- `14` = LunaProxy\n- `15` = IPHTML\n- `16` = PiaProxy\n- `17` = 922S5\n",
                    "example": []
                  },
                  "proxyStatus": {
                    "type": "integer",
                    "description": "Статус призначення проксі:\n- `0` = Звичайний\n- `1` = Не призначено\n- `2` = Оновлюється\n- `3` = Прострочено\n- `4` = Скоро завершиться  \n> Примітка: власні проксі завжди мають статус `1`.\n",
                    "example": 1
                  },
                  "proxyCheckStatus": {
                    "type": "integer",
                    "description": "Статус перевірки проксі:\n- `0` = Очікує\n- `1` = Успішно\n- `2` = Невдало\n- `3` = Невідома помилка\n",
                    "example": 1
                  },
                  "proxyTypes": {
                    "type": "array",
                    "items": {
                      "type": "integer"
                    },
                    "description": "Типи протоколів проксі:\n- `0` = HTTP\n- `1` = HTTPS\n- `2` = SOCKS5\n- `3` = SSH\n",
                    "example": []
                  }
                },
                "required": []
              },
              "example": {
                "id": "1800000000000101",
                "pageNo": 1,
                "pageSize": 10,
                "isCloudPhoneProxy": false,
                "proxyCategoryType": 2,
                "proxyIp": "",
                "proxyName": "",
                "proxyProviders": [],
                "proxyStatus": 1,
                "proxyCheckStatus": 1,
                "proxyTypes": []
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Успіх. `data.dataList` містить записи запитаної сторінки та є порожнім масивом за відсутності відповідників; `data.total`, `data.current` і `data.pages` описують нумерацію сторінок.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "description": "Код результату. `0` — успіх; інші коди означають помилку.",
                      "type": "integer"
                    },
                    "msg": {
                      "description": "Повідомлення про помилку",
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "data": {
                      "type": "object",
                      "properties": {
                        "current": {
                          "type": "string"
                        },
                        "dataList": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "expiryTime": {
                                "description": "Час завершення дії",
                                "type": "string"
                              },
                              "id": {
                                "description": "Первинний ключ",
                                "type": "string"
                              },
                              "proxyCategoryType": {
                                "description": "Тип проксі: 1 — проксі платформи; 2 — власний проксі",
                                "type": "integer"
                              },
                              "proxyCheckStatus": {
                                "description": "Статус перевірки: 0 — очікує перевірки, 1 — перевірка успішна, 2 — перевірка не вдалася, 3 — невідома помилка",
                                "type": "integer"
                              },
                              "state": {
                                "type": [
                                  "string",
                                  "null"
                                ],
                                "description": "Штат або область проксі. Пріоритет має визначене розташування вихідного IP, далі використовується налаштоване; можливі null або порожній рядок.",
                                "example": "California"
                              },
                              "city": {
                                "type": [
                                  "string",
                                  "null"
                                ],
                                "description": "Місто проксі. Пріоритет має визначене розташування вихідного IP, далі використовується налаштоване; можливі null або порожній рядок.",
                                "example": "Los Angeles"
                              },
                              "proxyPort": {
                                "type": [
                                  "integer",
                                  "null"
                                ],
                                "format": "int32",
                                "description": "Порт підключення до проксі; не визначається з імені проксі. Може бути null, якщо недоступний.",
                                "example": 1080
                              },
                              "proxyIp": {
                                "description": "IP проксі",
                                "type": "string"
                              },
                              "exportIp": {
                                "description": "Зовнішній IP",
                                "type": "string"
                              },
                              "countryCode": {
                                "description": "countryCode",
                                "type": "string"
                              },
                              "proxyName": {
                                "description": "Назва проксі",
                                "type": "string"
                              },
                              "proxyProvider": {
                                "description": "Тип проксі: значення за замовчуванням 0 - немає 4-Oxylabs 5-Proxys.io 7-Luminati 8-Lumauto 9-Oxylabsauto 10-Trojan，11-Shadowsocks 13-ABCPROXY 14-LunaProxy 15-IPHTML 16-PiaProxy 17-922S5\n",
                                "type": "integer"
                              },
                              "proxyType": {
                                "description": "Тип проксі: 0 - http, 1 - https, 2 - socks5, 3 - ssh",
                                "type": "integer"
                              },
                              "username": {
                                "description": "Ім'я користувача проксі",
                                "type": "string"
                              },
                              "password": {
                                "description": "Пароль проксі",
                                "type": "string"
                              },
                              "refreshUrl": {
                                "description": "URL оновлення проксі",
                                "type": "string"
                              }
                            }
                          }
                        },
                        "pages": {
                          "type": "string"
                        },
                        "total": {
                          "type": "string"
                        }
                      },
                      "required": [
                        "current",
                        "dataList",
                        "pages",
                        "total"
                      ]
                    },
                    "requestId": {
                      "description": "Ідентифікатор запиту операції",
                      "type": "string"
                    }
                  },
                  "required": [
                    "code",
                    "msg",
                    "data",
                    "requestId"
                  ]
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "data": {
                    "current": "1",
                    "dataList": [
                      {
                        "expiryTime": "2026-09-01 12:00:00",
                        "id": "1673823102599682",
                        "proxyCategoryType": 1,
                        "proxyCheckStatus": 1,
                        "state": "California",
                        "city": "Los Angeles",
                        "proxyPort": 1080,
                        "proxyIp": "string",
                        "exportIp": "9222",
                        "countryCode": "string",
                        "proxyName": "example-name",
                        "proxyProvider": 1,
                        "proxyType": 1,
                        "username": "example-name",
                        "password": "string",
                        "refreshUrl": "https://example.com/resource"
                      }
                    ],
                    "pages": "1",
                    "total": "1"
                  },
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d"
                }
              }
            },
            "headers": {}
          }
        }
      }
    },
    "/proxyInfo/add": {
      "post": {
        "summary": "Додавання проксі-сервера",
        "deprecated": false,
        "description": "Створює конфігурацію проксі в команді.\n- **Передумови**: `proxyPort` обов'язковий і має бути в діапазоні 1–65535, а `proxyProvider` має бути розпізнаваним Сервісом.\n- **Ефект**: вставляє запис проксі й повертає його ідентифікатор, готовий для прив'язки до профілів. Зберігається лише конфігурація.\n- **Завершення**: синхронне.\n- **Повтор**: **перевірки унікальності назви або конфігурації немає.** Надсилання того самого тіла двічі створить два проксі з двома ідентифікаторами. Після таймауту спершу пошукайте запис у `/proxyInfo/page`, а вже потім вирішуйте, чи надсилати повторно.\n\nЗадокументовані бізнес-помилки: `14023`. Значення кодів див. у [Error Codes](../Getting%20Started/error-codes.md). Будь-яка операція може додатково повернути загальні коди.",
        "operationId": "addUsingPOST",
        "tags": [
          "Proxy Management"
        ],
        "parameters": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "city": {
                    "type": "string",
                    "description": "Місто",
                    "example": ""
                  },
                  "country": {
                    "type": "string",
                    "description": "Код країни (ISO 3166-1 alpha-2). Обов'язковий лише якщо proxyProvider=17.\n",
                    "example": "AD"
                  },
                  "encryptionType": {
                    "type": "integer",
                    "format": "int32",
                    "description": "Тип шифрування; допустимі значення — цілі числа від 1 до 14.",
                    "example": 14
                  },
                  "ipChangeAction": {
                    "type": "integer",
                    "format": "int32",
                    "description": "Дія при зміні IP: 0 = блокувати, 1 = попередити",
                    "example": 1
                  },
                  "ipMonitor": {
                    "type": "boolean",
                    "description": "Увімкнути відстеження зміни IP",
                    "example": false
                  },
                  "password": {
                    "type": "string",
                    "description": "Пароль для аутентифікації проксі",
                    "example": ""
                  },
                  "proxyIp": {
                    "type": "string",
                    "description": "IP-адреса проксі",
                    "example": "8.10.22.46"
                  },
                  "proxyName": {
                    "type": "string",
                    "description": "Назва проксі (підтримує підстановки на кшталт {{random}})",
                    "example": "sock5_{{random}}"
                  },
                  "proxyPort": {
                    "type": "integer",
                    "format": "int32",
                    "description": "Номер порту проксі",
                    "example": 65534
                  },
                  "proxyProvider": {
                    "type": "integer",
                    "format": "int32",
                    "description": "Тип сервісу проксі:\n0=HTTP, 1=HTTPS, 2=SOCKS5, 3=SSH, 4=Oxylabs, 5=Proxys.io, 6=GeoSurf, 7=Luminati, 8=Lumauto, 9=Oxylabsauto, 10=Trojan, 11=Shadowsocks, 12=vmess, 13=ABCPROXY, 14=LunaProxy, 15=IPHTML, 16=PiaProxy, 17=922S5.\nОсобливі правила:\n- Якщо proxyProvider дорівнює 7 або 8, поле proxyType обов'язкове.\n- Якщо proxyProvider дорівнює 17, поле country обов'язкове; state і city необов'язкові.\n",
                    "example": 2
                  },
                  "proxyType": {
                    "type": "integer",
                    "format": "int32",
                    "description": "Тип протоколу проксі: 0=HTTP, 1=HTTPS, 2=SOCKS5, 3=SSH.\nОбов'язково лише коли proxyProvider дорівнює 7 або 8.\n",
                    "example": 1
                  },
                  "refreshUrl": {
                    "type": "string",
                    "description": "URL для оновлення IP динамічного проксі (якщо підтримується)",
                    "example": ""
                  },
                  "state": {
                    "type": "string",
                    "description": "Область/штат",
                    "example": ""
                  },
                  "username": {
                    "type": "string",
                    "description": "Ім'я користувача для аутентифікації проксі",
                    "example": ""
                  }
                },
                "required": [
                  "proxyIp",
                  "proxyPort",
                  "proxyProvider"
                ]
              },
              "example": {
                "proxyIp": "8.10.22.46",
                "proxyPort": 65534,
                "proxyProvider": 2,
                "proxyType": 1,
                "country": "AD",
                "state": "",
                "city": "",
                "encryptionType": 14,
                "ipChangeAction": 1,
                "ipMonitor": false,
                "proxyName": "sock5_{{random}}",
                "refreshUrl": "",
                "username": "",
                "password": ""
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Успіх. `data` — одне значення типу integer.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "description": "Код результату. `0` — успіх; інші коди означають помилку.",
                      "type": "integer"
                    },
                    "msg": {
                      "description": "Повідомлення про помилку",
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "data": {
                      "description": "Ідентифікатор проксі",
                      "type": "integer"
                    },
                    "requestId": {
                      "description": "Ідентифікатор запиту операції",
                      "type": "string"
                    }
                  },
                  "required": [
                    "code",
                    "msg",
                    "data",
                    "requestId"
                  ]
                },
                "example": {
                  "code": 0,
                  "msg": "",
                  "data": 0,
                  "requestId": "abcd1234"
                }
              }
            },
            "headers": {}
          }
        }
      }
    },
    "/proxyInfo/update": {
      "post": {
        "summary": "Зміна інформації проксі-сервера",
        "deprecated": false,
        "description": "Оновлює конфігурацію проксі.\n- **Передумови**: проксі має існувати в команді. **Динамічні проксі через цей ендпоінт оновити неможливо.** Сервіс має бути розпізнаваним значенням.\n- **Ефект**: це повне перезаписування, а не часткове оновлення: пропущені вами поля повертаються до значень за замовчуванням, а не зберігають поточні. Спершу прочитайте проксі й надішліть його назад цілком.\n- **Область дії**: прив'язки профілів зберігаються, бо змінюється лише сам запис проксі, але вже запущені браузер або хмарний телефон і далі використовують дані підключення, з якими вони були запущені. Перезапустіть їх, щоб застосувати нові.\n- **Завершення**: синхронне. Оптимістичного блокування немає, тому за одночасних оновлень перемагає останній запис.\n\nЗадокументовані бізнес-помилки: `14003`, `14023`. Значення кодів див. у [Error Codes](../Getting%20Started/error-codes.md). Будь-яка операція може додатково повернути загальні коди.",
        "operationId": "updateProxyUsingPOST",
        "tags": [
          "Proxy Management"
        ],
        "parameters": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "id",
                  "proxyIp",
                  "proxyPort",
                  "proxyProvider"
                ],
                "properties": {
                  "id": {
                    "type": "string",
                    "description": "Унікальний ID проксі"
                  },
                  "proxyIp": {
                    "type": "string",
                    "description": "IP-адреса проксі-сервера"
                  },
                  "proxyPort": {
                    "type": "integer",
                    "description": "Порт проксі-сервера"
                  },
                  "proxyName": {
                    "type": "string",
                    "description": "Власна назва проксі"
                  },
                  "country": {
                    "type": "string",
                    "description": "Країна (наприклад, \"US\", \"CN\")"
                  },
                  "city": {
                    "type": "string",
                    "description": "Назва міста"
                  },
                  "username": {
                    "type": "string",
                    "description": "Ім'я користувача аутентифікації (якщо потрібне)"
                  },
                  "password": {
                    "type": "string",
                    "description": "Пароль аутентифікації (якщо потрібен)"
                  },
                  "proxyType": {
                    "type": "integer",
                    "description": "Тип протоколу проксі:\n- `0` = HTTP\n- `1` = HTTPS\n- `2` = SOCKS5\n- `3` = SSH\n"
                  },
                  "proxyProvider": {
                    "type": "integer",
                    "description": "ID сервісу проксі:\n- `0` = HTTP\n- `1` = HTTPS\n- `2` = SOCKS5\n- `3` = SSH\n- `4` = Oxylabs\n- `5` = Proxys.io\n- `6` = GeoSurf\n- `7` = Luminati\n- `8` = Lumauto\n- `9` = Oxylabsauto\n- `10` = Trojan\n- `11` = Shadowsocks\n- `12` = vmess\n- `13` = ABCPROXY\n- `14` = LunaProxy\n- `15` = IPHTML\n- `16` = PiaProxy\n- `17` = 922S5\n"
                  },
                  "encryptionType": {
                    "type": "integer",
                    "description": "Тип шифрування (залежить від Сервіса, зазвичай 0 — без шифрування)"
                  },
                  "ipMonitor": {
                    "type": "boolean",
                    "description": "Увімкнути відстеження зміни IP"
                  },
                  "ipChangeAction": {
                    "type": "integer",
                    "description": "Дія при зміні IP:\n- `1` = Повідомити / Оновити (звичайне значення)\n> Повний перелік варіантів див. у документації системи.\n"
                  },
                  "refreshUrl": {
                    "type": "string",
                    "description": "URL для запуску зміни IP (якщо підтримується Сервісом)"
                  },
                  "state": {
                    "type": "string",
                    "description": "Резервне поле або власний стан (необов'язково)"
                  }
                }
              },
              "example": {
                "id": "1566403036579198",
                "proxyIp": "108.11.23.85",
                "proxyPort": 4096,
                "proxyName": "MyProxy",
                "country": "US",
                "city": "New York",
                "username": "",
                "password": "",
                "proxyType": 0,
                "proxyProvider": 0,
                "encryptionType": 0,
                "ipMonitor": true,
                "ipChangeAction": 1,
                "refreshUrl": "",
                "state": ""
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Успіх. Операція не повертає полезне навантаження; результат передається через `code`.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "description": "Код результату. `0` — успіх; інші коди означають помилку.",
                      "type": "integer"
                    },
                    "msg": {
                      "description": "Повідомлення про помилку",
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "requestId": {
                      "description": "Ідентифікатор запиту операції",
                      "type": "string"
                    }
                  },
                  "required": [
                    "code",
                    "msg",
                    "requestId"
                  ]
                },
                "example": {
                  "code": 0,
                  "msg": "",
                  "requestId": "efgh5678"
                }
              }
            },
            "headers": {}
          }
        }
      }
    },
    "/proxyInfo/delete": {
      "post": {
        "summary": "Видалити проксі-сервер",
        "deprecated": false,
        "description": "Видаляє одну або кілька конфігурацій проксі.\n- **Передумови**: хоча б один ідентифікатор має розв'язуватися в межах команди; нерозв'язані тихо ігноруються. **Проксі хмарної платформи, термін якого не сплив, видалити неможливо** — про це повідомляється окремим кодом помилки.\n- **Ефект**: власні проксі видаляються й відв'язуються від будь-якого проміжного сервера. Проксі хмарної платформи зі спливлим терміном замість цього позначається до звільнення, його підписку скасовують, а IP звільняється **асинхронно**: на момент повернення відповіді звільнення може ще тривати.\n- **Каскадні наслідки**: профілі й хмарні телефони, прив'язані до проксі, **не блокують видалення й не відв'язуються**. Вони й далі посилаються на видалений проксі, а запущені сесії не перериваються. Перед видаленням переприв'яжіть їх через `/env/setProxy/batch`.\n- **Повтор**: ідентифікатори обробляються по одному, і виклик переривається на першій відмові, тому пакет може застосуватися частково. Перед повтором перечитайте `/proxyInfo/page`.\n\nЗадокументовані бізнес-помилки: `14017`, `14024`. Значення кодів див. у [Error Codes](../Getting%20Started/error-codes.md). Будь-яка операція може додатково повернути загальні коди.",
        "operationId": "deleteProxyUsingPOST",
        "tags": [
          "Proxy Management"
        ],
        "parameters": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "array",
                "items": {
                  "type": "integer",
                  "format": "int64"
                }
              },
              "example": [
                1054661322597744600,
                1054661322597744600
              ]
            }
          }
        },
        "responses": {
          "200": {
            "description": "Успіх. Операція не повертає полезне навантаження; результат передається через `code`.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "description": "Код результату. `0` — успіх; інші коди означають помилку.",
                      "type": "integer"
                    },
                    "msg": {
                      "description": "Повідомлення про помилку",
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "requestId": {
                      "description": "Ідентифікатор запиту операції",
                      "type": "string"
                    }
                  },
                  "required": [
                    "code",
                    "msg",
                    "requestId"
                  ]
                },
                "example": {
                  "code": 0,
                  "msg": "",
                  "requestId": "ijkl9012"
                }
              }
            },
            "headers": {}
          }
        }
      }
    },
    "/envgroup/page": {
      "post": {
        "operationId": "envgroupPagePost",
        "summary": "Отримати список груп",
        "deprecated": false,
        "description": "Посторінково виводить групи профілів.\n- **Ефект**: відсутній. Лише читання. Повтор безпечний з обмеженою витримкою.\n- **Примітка**: якщо команда видає доступ за групами, учасник, якому не видано жодної групи, отримає порожню сторінку, а не помилку.",
        "tags": [
          "Group Management"
        ],
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "groupName": {
                    "type": "string",
                    "title": "Назва групи (часткова відповідність)"
                  },
                  "pageNo": {
                    "type": "integer",
                    "title": "Поточна сторінка"
                  },
                  "pageSize": {
                    "type": "integer",
                    "title": "Елементів на сторінці"
                  }
                },
                "required": [
                  "groupName",
                  "pageNo",
                  "pageSize"
                ]
              },
              "example": {
                "groupName": "132-kernel",
                "pageNo": 1,
                "pageSize": 10
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Успіх. `data.dataList` містить записи запитаної сторінки та є порожнім масивом за відсутності відповідників; `data.total`, `data.current` і `data.pages` описують нумерацію сторінок.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "description": "Код результату. `0` — успіх; інші коди означають помилку.",
                      "type": "integer"
                    },
                    "msg": {
                      "description": "Повідомлення про помилку",
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "data": {
                      "type": "object",
                      "properties": {
                        "current": {
                          "type": "string"
                        },
                        "dataList": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "id": {
                                "description": "Ідентифікатор групи",
                                "type": "string"
                              },
                              "groupName": {
                                "description": "Назва групи",
                                "type": "string"
                              }
                            }
                          }
                        },
                        "pages": {
                          "type": "string"
                        },
                        "total": {
                          "type": "string"
                        }
                      },
                      "required": [
                        "current",
                        "dataList",
                        "pages",
                        "total"
                      ]
                    },
                    "requestId": {
                      "description": "Ідентифікатор запиту операції",
                      "type": "string"
                    }
                  },
                  "required": [
                    "code",
                    "msg",
                    "data",
                    "requestId"
                  ]
                },
                "example": {
                  "code": 0,
                  "msg": "",
                  "data": {
                    "current": "0",
                    "dataList": [
                      {
                        "id": "0",
                        "groupName": ""
                      }
                    ],
                    "pages": "0",
                    "total": "0"
                  },
                  "requestId": ""
                }
              }
            },
            "headers": {}
          }
        }
      }
    },
    "/envgroup/edit": {
      "post": {
        "operationId": "envgroupEditPost",
        "summary": "Зміна інформації про групування",
        "deprecated": false,
        "description": "Перейменовує групу профілів.\n- **Передумови**: група має існувати в команді, той, хто викликає, має мати права на неї, а нова назва не має конфліктувати з іншою групою. Перевірка унікальності виконується лише якщо назва справді змінюється.\n- **Ефект**: перейменовує групу. Профілі залишаються в ній: вони посилаються на групу за ідентифікатором, тому більше нічого оновлювати не потрібно.\n- **Завершення**: синхронне й ідемпотентне.",
        "tags": [
          "Group Management"
        ],
        "parameters": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "groupName",
                  "id"
                ],
                "properties": {
                  "groupName": {
                    "type": "string",
                    "description": "Нова назва групи середовищ"
                  },
                  "id": {
                    "type": "string",
                    "description": "Унікальний ідентифікатор групи, яку оновлюють"
                  }
                }
              },
              "example": {
                "groupName": "Group-1574544945848579",
                "id": "1574525425557584"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Успіх. `data` — одне значення типу boolean.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "description": "Код результату. `0` — успіх; інші коди означають помилку.",
                      "type": "integer"
                    },
                    "msg": {
                      "description": "Повідомлення про помилку",
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "data": {
                      "type": "boolean",
                      "description": "Результат"
                    },
                    "requestId": {
                      "description": "Ідентифікатор запиту операції",
                      "type": "string"
                    }
                  },
                  "required": [
                    "code",
                    "msg",
                    "data",
                    "requestId"
                  ]
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "data": true,
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d"
                }
              }
            },
            "headers": {}
          }
        }
      }
    },
    "/envgroup/create": {
      "post": {
        "operationId": "envgroupCreatePost",
        "summary": "Додати групу",
        "deprecated": false,
        "description": "Створює групу профілів.\n- **Передумови**: назва не має бути порожньою, має бути не довшою за 100 символів і не має вже використовуватися іншою групою в команді. **Команда обмежена 1000 групами.**\n- **Ефект**: створює групу. Якщо команда видає доступ за групами, а той, хто викликає, не є власником, йому також видається доступ до нової групи.\n- **Завершення**: синхронне; `data` містить ідентифікатор нової групи.\n- **Повтор**: дублююча назва відхиляється, а не призводить до повторного використання наявної групи, тому повтор після успішного виклику, відповідь на який ви не побачили, завершиться помилкою про дублювання назви — це ознака того, що перший виклик спрацював. Підтвердьте через `/envgroup/page`.",
        "tags": [
          "Group Management"
        ],
        "parameters": [],
        "security": [
          {
            "Authorization": []
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {}
              },
              "example": {}
            }
          }
        },
        "responses": {
          "200": {
            "description": "Успіх. `data` — об'єкт із полями `id` і `groupName`.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "description": "Код результату. `0` — успіх; інші коди означають помилку.",
                      "type": "integer"
                    },
                    "msg": {
                      "description": "Повідомлення про помилку",
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "data": {
                      "description": "Дані, повернені операцією",
                      "type": "object",
                      "properties": {
                        "id": {
                          "description": "ID групи",
                          "type": "string"
                        },
                        "groupName": {
                          "description": "Назва групи",
                          "type": "string"
                        }
                      }
                    },
                    "requestId": {
                      "description": "Ідентифікатор запиту операції",
                      "type": "string"
                    }
                  },
                  "required": [
                    "code",
                    "msg",
                    "data",
                    "requestId"
                  ]
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "data": {
                    "id": "1673823102599682",
                    "groupName": "example-name"
                  },
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d"
                }
              }
            },
            "headers": {}
          }
        }
      }
    },
    "/envgroup/delete": {
      "post": {
        "operationId": "envgroupDeletePost",
        "summary": "Видалити групу",
        "deprecated": false,
        "description": "Видаляє одну або кілька груп профілів.\n- **Передумови**: хоча б один ідентифікатор має розв'язуватися в межах команди, і той, хто викликає, має мати права на нього; нерозв'язані ідентифікатори тихо ігноруються.\n- **Ефект**: видаляє групи та видані за ними права учасників. Профілі браузера й хмарні телефони, які в них перебували, стають без групи, тому висячих посилань на групу не залишається. Встановлення прапорця видалення середовищ додатково переміщує профілі, на які у вас є права, **до кошика**: вони не знищуються, а на хмарні телефони цей прапорець не впливає ніколи.\n- **Завершення**: синхронне, але **не атомарне**. Групу видаляють першою, а наступні кроки все ще можуть завершитися невдало — наприклад, якщо профіль запущений або передається, — і тоді група виявиться видаленою, а профілі залишаться на місці.\n- **Повтор**: перед повтором звірте `/envgroup/page` і список профілів.\n\nЗадокументовані бізнес-помилки: `19064`. Значення кодів див. у [Error Codes](../Getting%20Started/error-codes.md). Будь-яка операція може додатково повернути загальні коди.",
        "tags": [
          "Group Management"
        ],
        "parameters": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "ids"
                ],
                "properties": {
                  "ids": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    },
                    "description": "Унікальний ідентифікатор групи, яку оновлюють"
                  },
                  "isDeleteAllEnv": {
                    "type": "boolean",
                    "description": "Видалити середовища в групі? false — не видаляти, true — видалити"
                  }
                }
              },
              "example": {
                "ids": [
                  "string"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Успіх. `data` — одне значення типу boolean.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "description": "Код результату. `0` — успіх; інші коди означають помилку.",
                      "type": "integer"
                    },
                    "msg": {
                      "description": "Повідомлення про помилку",
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "data": {
                      "type": "boolean"
                    },
                    "requestId": {
                      "description": "Ідентифікатор запиту операції",
                      "type": "string"
                    }
                  },
                  "required": [
                    "code",
                    "msg",
                    "data",
                    "requestId"
                  ]
                },
                "example": {
                  "code": 0,
                  "msg": "",
                  "data": true,
                  "requestId": ""
                }
              }
            },
            "headers": {}
          }
        }
      }
    },
    "/envtag/all": {
      "get": {
        "operationId": "envtagAllGet",
        "summary": "Отримання списку тегів",
        "deprecated": false,
        "description": "Повертає всі мітки профілів у команді.\n- **Ефект**: відсутній. Лише читання. Повтор безпечний з обмеженою витримкою.\n- **Примітка**: цей ендпоінт **не підтримує пагінації, а в міток немає серверного обмеження**, тому відповідь зростає разом із числом міток, створених вашою командою. Враховуйте це під час проектування клієнта.",
        "tags": [
          "Tag Management"
        ],
        "parameters": [],
        "responses": {
          "200": {
            "description": "Успіх. `data` — масив об'єктів із полями `id` і `tagName`; порожній масив, якщо повертати нічого.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "description": "Код результату. `0` — успіх; інші коди означають помилку.",
                      "type": "integer"
                    },
                    "msg": {
                      "description": "Повідомлення про помилку",
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "data": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "id": {
                            "description": "ID тегів",
                            "type": "string"
                          },
                          "tagName": {
                            "description": "Назва тегів",
                            "type": "string"
                          }
                        }
                      }
                    },
                    "requestId": {
                      "description": "Ідентифікатор запиту операції",
                      "type": "string"
                    }
                  },
                  "required": [
                    "code",
                    "msg",
                    "data",
                    "requestId"
                  ]
                },
                "example": {
                  "code": 0,
                  "msg": "",
                  "data": [
                    {
                      "id": "0",
                      "tagName": ""
                    }
                  ],
                  "requestId": ""
                }
              }
            },
            "headers": {}
          }
        }
      }
    },
    "/envtag/create": {
      "post": {
        "operationId": "envtagCreatePost",
        "summary": "Створити теги",
        "deprecated": false,
        "description": "Створює мітку профілю.\n- **Передумови**: назва не має бути порожньою, має бути не довшою за 100 символів і не має вже використовуватися іншою міткою в команді.\n- **Ефект**: створює мітку й повертає її ідентифікатор. На відміну від груп, у міток немає обмеження за кількістю.\n- **Повтор**: дублююча назва відхиляється, а не призводить до повторного використання наявної мітки. Підтвердьте через `/envtag/all`.",
        "tags": [
          "Tag Management"
        ],
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "tagName": {
                    "type": "string",
                    "description": "назва тегу"
                  }
                }
              },
              "example": {
                "tagName": "Tag-123"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Успіх. `data` — об'єкт із полями `id` і `tagName`.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "description": "Код результату. `0` — успіх; інші коди означають помилку.",
                      "type": "integer"
                    },
                    "msg": {
                      "description": "Повідомлення про помилку",
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "data": {
                      "type": "object",
                      "properties": {
                        "id": {
                          "description": "ID тегів",
                          "type": "string"
                        },
                        "tagName": {
                          "description": "Назва тегів",
                          "type": "string"
                        }
                      },
                      "required": [
                        "id",
                        "tagName"
                      ]
                    },
                    "requestId": {
                      "description": "Ідентифікатор запиту операції",
                      "type": "string"
                    },
                    "error": {
                      "type": "object",
                      "properties": {}
                    }
                  },
                  "required": [
                    "code",
                    "msg",
                    "data",
                    "requestId"
                  ]
                },
                "example": {
                  "code": 0,
                  "msg": "",
                  "data": {
                    "id": "0",
                    "tagName": ""
                  },
                  "requestId": ""
                }
              }
            },
            "headers": {}
          }
        }
      }
    },
    "/envtag/edit": {
      "post": {
        "operationId": "envtagEditPost",
        "summary": "Змінити інформацію тегів",
        "deprecated": false,
        "description": "Перейменовує мітку профілю.\n- **Передумови**: мітка має існувати в команді, а нова назва не має конфліктувати з іншою міткою.\n- **Ефект**: перейменовує мітку. Наявні прив'язки не змінюються, і профілі одразу показують нову назву.\n- **Завершення**: синхронне й ідемпотентне.",
        "tags": [
          "Tag Management"
        ],
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "id": {
                    "type": "string",
                    "description": "ID тегу"
                  },
                  "tagName": {
                    "type": "string",
                    "description": "назва тегу"
                  }
                }
              },
              "example": {
                "id": "1564715845550177",
                "tagName": "Updated-123"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Успіх. `data` — одне значення типу boolean.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "description": "Код результату. `0` — успіх; інші коди означають помилку.",
                      "type": "integer"
                    },
                    "msg": {
                      "description": "Повідомлення про помилку",
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "data": {
                      "type": "boolean"
                    },
                    "requestId": {
                      "description": "Ідентифікатор запиту операції",
                      "type": "string"
                    },
                    "error": {
                      "type": "object",
                      "properties": {}
                    }
                  },
                  "required": [
                    "code",
                    "msg",
                    "data",
                    "requestId"
                  ]
                },
                "example": {
                  "code": 0,
                  "msg": "",
                  "data": true,
                  "requestId": ""
                }
              }
            },
            "headers": {}
          }
        }
      }
    },
    "/envtag/delete": {
      "post": {
        "operationId": "envtagDeletePost",
        "summary": "Видалити теги",
        "deprecated": false,
        "description": "Видаляє одну або кілька міток профілів.\n- **Передумови**: хоча б один ідентифікатор має розв'язуватися в межах команди; нерозв'язані тихо ігноруються.\n- **Ефект**: видаляє мітки. Мітка зникає з усіх профілів, на яких вона була, і жоден профіль не видаляється. Цей ендпоінт керує лише мітками профілів: мітки файлів Cloud Storage керуються окремо.\n- **Завершення**: синхронне. Повторний виклик повідомить, що мітки недопустимі, а це означає, що перший виклик спрацював.\n\nЗадокументовані бізнес-помилки: `19105`. Значення кодів див. у [Error Codes](../Getting%20Started/error-codes.md). Будь-яка операція може додатково повернути загальні коди.",
        "tags": [
          "Tag Management"
        ],
        "parameters": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "ids"
                ],
                "properties": {
                  "ids": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    },
                    "description": "Унікальний ID тегу, який оновлюється"
                  }
                }
              },
              "example": {
                "ids": [
                  "string"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Успіх. `data` — одне значення типу boolean.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "description": "Код результату. `0` — успіх; інші коди означають помилку.",
                      "type": "integer"
                    },
                    "msg": {
                      "description": "Повідомлення про помилку",
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "data": {
                      "type": "boolean"
                    },
                    "requestId": {
                      "description": "Ідентифікатор запиту операції",
                      "type": "string"
                    }
                  },
                  "required": [
                    "code",
                    "msg",
                    "data",
                    "requestId"
                  ]
                },
                "example": {
                  "code": 0,
                  "msg": "",
                  "data": true,
                  "requestId": ""
                }
              }
            },
            "headers": {}
          }
        }
      }
    },
    "/webhook/config": {
      "post": {
        "operationId": "webhookConfigPost",
        "summary": "Налаштувати вебхук команди",
        "deprecated": false,
        "description": "Створює або замінює конфігурацію вебхука команди.\n\n- **Передумови**: `callbackUrl` має бути HTTPS-URL довжиною від 1 до 1024 символів, з іменем хоста, без даних користувача, без фрагмента та з коректним портом. Усі адреси, у які він розв'язується, повинні маршрутизуватися в інтернеті; діапазони localhost, приватні, link-local, CGNAT, метаданих хмари, зарезервовані протоколом, документаційні та 6to4 відхиляються. Та сама перевірка повторюється в момент відкриття з'єднання під час доставки, тому імʼя, яке згодом розв'яжеться у приватний діапазон, призведе до невдачі цієї доставки, а не до звернення у вашу мережу.\n- **Дія**: виконує upsert єдиної конфігурації команди із серверного контексту. `teamId` ніколи не читається із запиту, тому той, хто викликає, не може налаштувати іншу команду. Ендпоінти Local API та Open API читають і пишуть той самий запис, а відповідь повторює збережене.\n- **Вимкнення**: `enabled: false` зберігає URL і припиняє створення нових подій. Уже поставлені в чергу події скасовуються по одній, якщо на момент їх авторизації конфігурація все ще вимкнена, тому швидке повторне ввімкнення дає їм продовжитися.\n- **Повтор**: безпечно. Збереження — це upsert за командою, тому повторення того самого запиту сходиться до того самого стану.\n\nКонтракт зворотного виклику, назви подій і розклад повторів див. у [Webhooks](../Getting%20Started/webhooks.md).\n\nЗадокументовані бізнес-помилки: `41001`. Значення кодів див. у [Error Codes](../Getting%20Started/error-codes.md). Будь-яка операція може додатково повернути загальні коди.",
        "tags": [
          "Webhook Management"
        ],
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "callbackUrl": {
                    "description": "HTTPS-URL, який приймає події. Від 1 до 1024 символів.",
                    "type": "string",
                    "maxLength": 1024
                  },
                  "enabled": {
                    "description": "Чи ввімкнено доставку для команди.",
                    "type": "boolean"
                  }
                },
                "required": [
                  "callbackUrl",
                  "enabled"
                ]
              },
              "example": {
                "callbackUrl": "https://example.com/morelogin/webhook",
                "enabled": true
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Успіх. `data` — об'єкт із полями `callbackUrl` та `enabled`, що повторює збережену конфігурацію.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "description": "Код результату. `0` — успіх; інші коди означають помилку.",
                      "type": "integer"
                    },
                    "msg": {
                      "description": "Повідомлення про помилку",
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "data": {
                      "type": "object",
                      "properties": {
                        "callbackUrl": {
                          "description": "Збережений HTTPS-URL зворотного виклику.",
                          "type": "string"
                        },
                        "enabled": {
                          "description": "Чи ввімкнено доставку для команди.",
                          "type": "boolean"
                        }
                      }
                    },
                    "requestId": {
                      "description": "Ідентифікатор запиту операції",
                      "type": "string"
                    }
                  },
                  "required": [
                    "code",
                    "msg",
                    "data",
                    "requestId"
                  ]
                },
                "example": {
                  "code": 0,
                  "msg": "",
                  "data": {
                    "callbackUrl": "https://example.com/morelogin/webhook",
                    "enabled": true
                  },
                  "requestId": ""
                }
              }
            },
            "headers": {}
          }
        }
      }
    }
  },
  "webhooks": {
    "cloud_phone.power_on": {
      "post": {
        "operationId": "webhookCloudPhonePowerOn",
        "summary": "Увімкнення хмарного телефона завершено",
        "description": "Надсилається, коли увімкнення досягло підсумкового результату.\n\n`success` дорівнює `true` лише якщо зворотний виклик сервісу був успішним і локальна синхронізація зафіксована. Помилка списання коштів або асинхронна перевірка проксі, яка завершилася невдало та довела до кінця своє очищення, повідомляють про невдале увімкнення і не створюють окремої події вимкнення. Відкладені задачі, наприклад встановлення попередньо визначених застосунків, результат не змінюють.\n\nЯкщо завантаження перервала операція вимкнення, для цієї спроби подія увімкнення не створюється; успішне вимкнення згодом усе одно створить власне `cloud_phone.power_off`.",
        "tags": [
          "Webhook Management"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/WebhookEventId"
          },
          {
            "$ref": "#/components/parameters/WebhookEventType"
          },
          {
            "$ref": "#/components/parameters/WebhookUserAgent"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CloudPhoneWebhookEvent"
              },
              "example": {
                "eventId": "c7f3a2b10d8e4f6a9c1b2d3e4f5a6b7c",
                "eventType": "cloud_phone.power_on",
                "eventTime": "1787241600000",
                "data": {
                  "teamId": "10001",
                  "cloudPhoneId": "20001"
                },
                "result": {
                  "success": false,
                  "code": "33318",
                  "message": "Operation failed"
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "$ref": "#/components/responses/WebhookAck"
          }
        }
      }
    },
    "cloud_phone.power_off": {
      "post": {
        "operationId": "webhookCloudPhonePowerOff",
        "summary": "Хмарний телефон вимкнено",
        "description": "Надсилається при успішному вимкненні. Невдале вимкнення цю подію не створює, тому тут `result.success` завжди `true`.\n\n`data.reason` фіксує причину зупинки.",
        "tags": [
          "Webhook Management"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/WebhookEventId"
          },
          {
            "$ref": "#/components/parameters/WebhookEventType"
          },
          {
            "$ref": "#/components/parameters/WebhookUserAgent"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CloudPhonePowerOffWebhookEvent"
              },
              "example": {
                "eventId": "5b1d0c9e7a2f4d38b6c5a4e3f2d1c0b9",
                "eventType": "cloud_phone.power_off",
                "eventTime": "1787241600000",
                "data": {
                  "teamId": "10001",
                  "cloudPhoneId": "20001",
                  "reason": "MONEY_SAVING"
                },
                "result": {
                  "success": true,
                  "code": "0",
                  "message": null
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "$ref": "#/components/responses/WebhookAck"
          }
        }
      }
    },
    "cloud_phone.restart": {
      "post": {
        "operationId": "webhookCloudPhoneRestart",
        "summary": "Перезапуск хмарного телефона завершено",
        "description": "Надсилається, коли перезапуск досяг підсумкового результату. `success` дорівнює `true` лише якщо зворотний виклик сервісу був успішним і локальна синхронізація зафіксована.",
        "tags": [
          "Webhook Management"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/WebhookEventId"
          },
          {
            "$ref": "#/components/parameters/WebhookEventType"
          },
          {
            "$ref": "#/components/parameters/WebhookUserAgent"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CloudPhoneWebhookEvent"
              },
              "example": {
                "eventId": "9e4c1a7b3f2d40518a6b5c4d3e2f1a0b",
                "eventType": "cloud_phone.restart",
                "eventTime": "1787241600000",
                "data": {
                  "teamId": "10001",
                  "cloudPhoneId": "20001"
                },
                "result": {
                  "success": true,
                  "code": "0",
                  "message": null
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "$ref": "#/components/responses/WebhookAck"
          }
        }
      }
    },
    "cloud_phone.reset": {
      "post": {
        "operationId": "webhookCloudPhoneReset",
        "summary": "Скидання хмарного телефона завершено",
        "description": "Надсилається, коли скидання досягло підсумкового результату. `success` дорівнює `true` лише якщо зворотний виклик сервісу був успішним і локальна синхронізація зафіксована.",
        "tags": [
          "Webhook Management"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/WebhookEventId"
          },
          {
            "$ref": "#/components/parameters/WebhookEventType"
          },
          {
            "$ref": "#/components/parameters/WebhookUserAgent"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CloudPhoneWebhookEvent"
              },
              "example": {
                "eventId": "2f8a6d4c0b9e47138c7d6e5f4a3b2c1d",
                "eventType": "cloud_phone.reset",
                "eventTime": "1787241600000",
                "data": {
                  "teamId": "10001",
                  "cloudPhoneId": "20001"
                },
                "result": {
                  "success": true,
                  "code": "0",
                  "message": null
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "$ref": "#/components/responses/WebhookAck"
          }
        }
      }
    },
    "cloud_phone.new_machine": {
      "post": {
        "operationId": "webhookCloudPhoneNewMachine",
        "summary": "Створення нового пристрою одним клацанням для хмарного телефона завершено",
        "description": "Надсилається, коли операція створення нового пристрою одним клацанням досягла підсумкового результату. `success` дорівнює `true` лише якщо зворотний виклик сервісу був успішним і локальна синхронізація зафіксована.",
        "tags": [
          "Webhook Management"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/WebhookEventId"
          },
          {
            "$ref": "#/components/parameters/WebhookEventType"
          },
          {
            "$ref": "#/components/parameters/WebhookUserAgent"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CloudPhoneWebhookEvent"
              },
              "example": {
                "eventId": "7c3b1e9d5a4f42068b1c2d3e4f5a6b70",
                "eventType": "cloud_phone.new_machine",
                "eventTime": "1787241600000",
                "data": {
                  "teamId": "10001",
                  "cloudPhoneId": "20001"
                },
                "result": {
                  "success": true,
                  "code": "0",
                  "message": null
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "$ref": "#/components/responses/WebhookAck"
          }
        }
      }
    },
    "cloud_browser.start": {
      "post": {
        "operationId": "webhookCloudBrowserStart",
        "summary": "Запуск хмарного браузера завершено",
        "description": "Надсилається, коли запуск хмарного браузера досяг підсумкового результату.",
        "tags": [
          "Webhook Management"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/WebhookEventId"
          },
          {
            "$ref": "#/components/parameters/WebhookEventType"
          },
          {
            "$ref": "#/components/parameters/WebhookUserAgent"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CloudBrowserWebhookEvent"
              },
              "example": {
                "eventId": "4a9f2c7e1b8d43509c6a5b4c3d2e1f00",
                "eventType": "cloud_browser.start",
                "eventTime": "1787241600000",
                "data": {
                  "teamId": "10001",
                  "cloudBrowserId": "30001",
                  "runId": "40001"
                },
                "result": {
                  "success": true,
                  "code": "0",
                  "message": null
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "$ref": "#/components/responses/WebhookAck"
          }
        }
      }
    },
    "cloud_browser.stop": {
      "post": {
        "operationId": "webhookCloudBrowserStop",
        "summary": "Зупинку хмарного браузера завершено",
        "description": "Надсилається при кожній спробі зупинки хмарного браузера, успішній чи ні. Перехід у стан невдалої зупинки сам собою є невдалим результатом цієї спроби; подальший повтор вручну або примусове звільнення вважаються новою операцією та отримують новий `eventId`.\n\nПодії дедуплікуються за операцією зупинки, тому одна спроба ніколи не дає дві події, а дві спроби ніколи не об'єднуються. Внутрішня помилка архівування змінює лише `result` і ніколи не перезаписує `reason`, зафіксований на початку зупинки.",
        "tags": [
          "Webhook Management"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/WebhookEventId"
          },
          {
            "$ref": "#/components/parameters/WebhookEventType"
          },
          {
            "$ref": "#/components/parameters/WebhookUserAgent"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CloudBrowserStopWebhookEvent"
              },
              "example": {
                "eventId": "c7f3a2b10d8e4f6a9c1b2d3e4f5a6b7c",
                "eventType": "cloud_browser.stop",
                "eventTime": "1787241600000",
                "data": {
                  "teamId": "10001",
                  "cloudBrowserId": "30001",
                  "runId": "40001",
                  "reason": "BROWSER_EXITED"
                },
                "result": {
                  "success": false,
                  "code": "40006",
                  "message": "Operation failed"
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "$ref": "#/components/responses/WebhookAck"
          }
        }
      }
    }
  },
  "components": {
    "securitySchemes": {
      "Authorization": {
        "type": "http",
        "description": "Значення поля access_token з відповіді інтерфейсу отримання токена доступу",
        "scheme": "bearer",
        "bearerFormat": "JWT"
      }
    },
    "parameters": {
      "WebhookEventId": {
        "name": "X-Webhook-Event-Id",
        "in": "header",
        "required": true,
        "description": "Те саме значення, що `eventId` у тілі. Використовуйте його, щоб обробник був ідемпотентним.",
        "schema": {
          "type": "string"
        }
      },
      "WebhookEventType": {
        "name": "X-Webhook-Event-Type",
        "in": "header",
        "required": true,
        "description": "Те саме значення, що `eventType` у тілі, щоб маршрутизувати без розбору тіла.",
        "schema": {
          "type": "string"
        }
      },
      "WebhookUserAgent": {
        "name": "User-Agent",
        "in": "header",
        "required": true,
        "description": "Завжди `MoreLogin-Webhook/1.0`.",
        "schema": {
          "type": "string"
        }
      }
    },
    "responses": {
      "WebhookAck": {
        "description": "Будь-який 2xx вважається доставкою. Тіло відповіді ігнорується, тому відповідайте якомога раніше, а роботу виконуйте асинхронно. Усе інше, включно з тайм-аутом з'єднання або читання, вважається невдачею та повторюється."
      }
    },
    "schemas": {
      "WebhookResult": {
        "type": "object",
        "description": "Підсумковий результат операції, яку описує подія.",
        "properties": {
          "success": {
            "description": "Чи завершилася операція успішно.",
            "type": "boolean"
          },
          "code": {
            "description": "`0` у разі успіху. У разі невдачі — стабільний бізнес-код помилки, що не залежить від мови.",
            "type": "string"
          },
          "message": {
            "description": "`null` у разі успіху. У разі невдачі — пояснення мовою команди; якщо мова або її текст недоступні, використовується `en-US`.",
            "type": [
              "string",
              "null"
            ]
          }
        },
        "required": [
          "success",
          "code",
          "message"
        ]
      },
      "CloudPhoneWebhookEvent": {
        "type": "object",
        "properties": {
          "eventId": {
            "description": "Унікальний ID події. Повтори доставки та внутрішні відтворення тієї самої події використовують його повторно, тому вважайте його ключем ідемпотентності.",
            "type": "string"
          },
          "eventType": {
            "description": "Стабільна назва події.",
            "type": "string"
          },
          "eventTime": {
            "description": "Коли настав підсумковий бізнес-результат, у мілісекундах епохи Unix. Передається рядком.",
            "type": "string"
          },
          "data": {
            "type": "object",
            "properties": {
              "teamId": {
                "description": "Команда, якій належить ресурс.",
                "type": "string"
              },
              "cloudPhoneId": {
                "description": "Хмарний телефон, до якого стосується подія.",
                "type": "string"
              }
            },
            "required": [
              "teamId",
              "cloudPhoneId"
            ]
          },
          "result": {
            "$ref": "#/components/schemas/WebhookResult"
          }
        },
        "required": [
          "eventId",
          "eventType",
          "eventTime",
          "data",
          "result"
        ]
      },
      "CloudPhonePowerOffWebhookEvent": {
        "type": "object",
        "properties": {
          "eventId": {
            "description": "Унікальний ID події. Повтори доставки та внутрішні відтворення тієї самої події використовують його повторно, тому вважайте його ключем ідемпотентності.",
            "type": "string"
          },
          "eventType": {
            "description": "Стабільна назва події.",
            "type": "string"
          },
          "eventTime": {
            "description": "Коли настав підсумковий бізнес-результат, у мілісекундах епохи Unix. Передається рядком.",
            "type": "string"
          },
          "data": {
            "type": "object",
            "properties": {
              "teamId": {
                "description": "Команда, якій належить ресурс.",
                "type": "string"
              },
              "cloudPhoneId": {
                "description": "Хмарний телефон, до якого стосується подія.",
                "type": "string"
              },
              "reason": {
                "description": "Причина зупинки телефона.",
                "type": "string",
                "enum": [
                  "NORMAL",
                  "MONEY_SAVING",
                  "OTHER"
                ]
              }
            },
            "required": [
              "teamId",
              "cloudPhoneId",
              "reason"
            ]
          },
          "result": {
            "$ref": "#/components/schemas/WebhookResult"
          }
        },
        "required": [
          "eventId",
          "eventType",
          "eventTime",
          "data",
          "result"
        ]
      },
      "CloudBrowserWebhookEvent": {
        "type": "object",
        "properties": {
          "eventId": {
            "description": "Унікальний ID події. Повтори доставки та внутрішні відтворення тієї самої події використовують його повторно, тому вважайте його ключем ідемпотентності.",
            "type": "string"
          },
          "eventType": {
            "description": "Стабільна назва події.",
            "type": "string"
          },
          "eventTime": {
            "description": "Коли настав підсумковий бізнес-результат, у мілісекундах епохи Unix. Передається рядком.",
            "type": "string"
          },
          "data": {
            "type": "object",
            "properties": {
              "teamId": {
                "description": "Команда, якій належить ресурс.",
                "type": "string"
              },
              "cloudBrowserId": {
                "description": "Профіль хмарного браузера, до якого стосується подія.",
                "type": "string"
              },
              "runId": {
                "description": "Екземпляр запуску, до якого стосується подія.",
                "type": "string"
              }
            },
            "required": [
              "teamId",
              "cloudBrowserId",
              "runId"
            ]
          },
          "result": {
            "$ref": "#/components/schemas/WebhookResult"
          }
        },
        "required": [
          "eventId",
          "eventType",
          "eventTime",
          "data",
          "result"
        ]
      },
      "CloudBrowserStopWebhookEvent": {
        "type": "object",
        "properties": {
          "eventId": {
            "description": "Унікальний ID події. Повтори доставки та внутрішні відтворення тієї самої події використовують його повторно, тому вважайте його ключем ідемпотентності.",
            "type": "string"
          },
          "eventType": {
            "description": "Стабільна назва події.",
            "type": "string"
          },
          "eventTime": {
            "description": "Коли настав підсумковий бізнес-результат, у мілісекундах епохи Unix. Передається рядком.",
            "type": "string"
          },
          "data": {
            "type": "object",
            "properties": {
              "teamId": {
                "description": "Команда, якій належить ресурс.",
                "type": "string"
              },
              "cloudBrowserId": {
                "description": "Профіль хмарного браузера, до якого стосується подія.",
                "type": "string"
              },
              "runId": {
                "description": "Екземпляр запуску, до якого стосується подія.",
                "type": "string"
              },
              "reason": {
                "description": "Причина зупинки запуску.",
                "type": "string",
                "enum": [
                  "NORMAL",
                  "MONEY_SAVING",
                  "ENERGY_SAVING",
                  "BROWSER_EXITED",
                  "OTHER"
                ]
              }
            },
            "required": [
              "teamId",
              "cloudBrowserId",
              "runId",
              "reason"
            ]
          },
          "result": {
            "$ref": "#/components/schemas/WebhookResult"
          }
        },
        "required": [
          "eventId",
          "eventType",
          "eventTime",
          "data",
          "result"
        ]
      }
    }
  },
  "servers": [
    {
      "url": "https://api.morelogin.com",
      "description": "Ендпоінт MoreLogin Open API"
    }
  ],
  "security": [
    {
      "Authorization": []
    }
  ]
}